package com.sinogrand.elevator.utils

import com.sinogrand.elevator.data.models.PageInfo

/**
 * 分页工具类
 */
object PaginationUtils {
    
    /**
     * 判断是否还有下一页数据
     * @param pageInfo 分页信息
     * @return true 表示还有下一页，false 表示没有下一页
     */
    fun hasNextPage(pageInfo: PageInfo?): Boolean {
        if (pageInfo == null) return false
        
        val currentPage = pageInfo.page
        val pageSize = pageInfo.size
        val total = pageInfo.total
        
        // 计算总页数
        val totalPages = if (pageSize > 0) {
            (total + pageSize - 1) / pageSize  // 向上取整
        } else {
            0
        }
        
        // 当前页小于总页数表示还有下一页
        return currentPage < totalPages
    }
    
    /**
     * 判断是否还有下一页数据（重载方法，直接传入分页参数）
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @param total 总条数
     * @return true 表示还有下一页，false 表示没有下一页
     */
    fun hasNextPage(currentPage: Int, pageSize: Int, total: Int): Boolean {
        if (pageSize <= 0) return false
        
        val totalPages = (total + pageSize - 1) / pageSize  // 向上取整
        return currentPage < totalPages
    }
    
    /**
     * 获取下一页页码
     * @param pageInfo 分页信息
     * @return 下一页页码，如果没有下一页则返回当前页
     */
    fun getNextPage(pageInfo: PageInfo?): Int {
        if (pageInfo == null) return 1
        return if (hasNextPage(pageInfo)) {
            pageInfo.page + 1
        } else {
            pageInfo.page
        }
    }
    
    /**
     * 获取总页数
     * @param pageInfo 分页信息
     * @return 总页数
     */
    fun getTotalPages(pageInfo: PageInfo?): Int {
        if (pageInfo == null) return 0
        
        val pageSize = pageInfo.size
        val total = pageInfo.total
        
        return if (pageSize > 0) {
            (total + pageSize - 1) / pageSize  // 向上取整
        } else {
            0
        }
    }
    
    /**
     * 判断是否是第一页
     * @param pageInfo 分页信息
     * @return true 表示是第一页，false 表示不是第一页
     */
    fun isFirstPage(pageInfo: PageInfo?): Boolean {
        return pageInfo?.page == 1
    }
    
    /**
     * 判断是否是最后一页
     * @param pageInfo 分页信息
     * @return true 表示是最后一页，false 表示不是最后一页
     */
    fun isLastPage(pageInfo: PageInfo?): Boolean {
        if (pageInfo == null) return true
        return !hasNextPage(pageInfo)
    }
    
    /**
     * 获取当前页已加载的数据条数
     * @param pageInfo 分页信息
     * @return 当前页已加载的数据条数
     */
    fun getCurrentPageItemCount(pageInfo: PageInfo?): Int {
        if (pageInfo == null) return 0
        
        val currentPage = pageInfo.page
        val pageSize = pageInfo.size
        val total = pageInfo.total
        
        // 计算当前页应该显示的数据条数
        val startIndex = (currentPage - 1) * pageSize
        val endIndex = minOf(startIndex + pageSize, total)
        
        return maxOf(0, endIndex - startIndex)
    }
    
    /**
     * 获取已加载的总数据条数
     * @param pageInfo 分页信息
     * @return 已加载的总数据条数
     */
    fun getLoadedItemCount(pageInfo: PageInfo?): Int {
        if (pageInfo == null) return 0
        
        val currentPage = pageInfo.page
        val pageSize = pageInfo.size
        val total = pageInfo.total
        
        // 已加载的数据条数 = 当前页 * 每页大小，但不能超过总条数
        return minOf(currentPage * pageSize, total)
    }
}
